"""
这是主要的student模块的运行模块
"""
from 期末项目.student.student import Student


class StudentManager(object):
    def __init__(self):
        # 创建一个列表用来保存数据 列表就相当于我们java里面的list集合
        self.stu_list = []

    def run(self):
        # 加载文件数据
        self.load()
        while True:
            # 显示可选择的功能
            self.xianshi()
            """
                int(a) 表示吧a转换成为整数类型
                input("请输入你想要的功能：")：相当于键盘输入语句，并且提示你要进行这样的输入
                但是键盘输入的数据默认是字符串类型，我们需要的是整数类型所以需要转换
            """
            xz1 = int(input("请输入你想要的功能："))
            if xz1 == 1:
                self.stu_add() # 调用增加的方法
            elif xz1 == 2:
                self.stu_del()
            elif xz1 == 3:
                self.stu_up()
            elif xz1 == 4:
                self.seOne_stu()
            elif xz1 == 5:
                self.seAll_stu()
            elif xz1 == 6:
                self.save()
            elif xz1 == 7:
                break # 退出程序

    def xianshi(self):
        print("1、增加学生功能")
        print("2、删除学生功能")
        print("3、修改学生功能")
        print("4、查询一个学生功能")
        print("5、查询全部学生功能")
        print("6、保存学生信息到文件功能")
        print("7、退出系统功能")

    # 增加功能代码
    def stu_add(self):
        name = input("请输入对象的姓名：")
        age = input("请输入对象的年龄：")
        gender = input("请输入对象的性别：")
        tel = input("请输入对象的电话号码：")
        student = Student(name,age,gender,tel)
        # 把增加的student对象保存到列表里面
        # append(数据)  把数据保存到列表里面
        self.stu_list.append(student)
        print("下面是列表内部的数据")
        """
            in 需要便利的数据集
            i  就表示每一次便利数据集内部的数据
        """
        for i in self.stu_list:
            print(i)
    # 删除的方法
    def stu_del(self):
        """
            1、键盘输入想要删除的姓名
            2、便利列表，删除列表内部和想要删除姓名相同的对象
            3、删除列表内部对应的对象
            4、如果没有找到就输出没找到你想要的删除的对象
            5、最后便利列表查看操作之后的列表数据
            self.stu_list.remove(数据)
        """
        name = input("请输入想要删除的姓名：")
        for i in self.stu_list:
            if i.name == name: # 删除列表内部和想要删除姓名相同的对象
                self.stu_list.remove(i)
            else:
                print("我没有找到你想要的删除娃")
        print("下面是列表内部的数据")
        for i in self.stu_list:
            print(i)

    # 修改功能
    def stu_up(self):
        name = input("请输入你想要的修改对象的姓名：")
        # 下面是我修改的数据
        name1 = input("请输入你想要修改的名字：")
        age1 = input("请输入你想要修改的年龄：")
        gender1 = input("请输入你想要修改的性别：")
        tel1 = input("请输入你想要修改的电话：")
        for i in self.stu_list:
            if i.name == name: # 找到列表内部和想要修改姓名相同的对象
                # 给对象属性重新赋值
                i.name = name1
                i.age = age1
                i.gender = gender1
                i.tel = tel1
            else:
                print("我没有找到你想要的删除娃")
        print("下面是列表内部的数据")
        for i in self.stu_list:
            print(i)

    def seOne_stu(self):
        # 1、优先判断列表是否为空  len(数据) 判断数据的长度
        if len(self.stu_list) == 0:# 表示列表长度为0
            print("列表内部没有数据！！！！！")
        else:
            # 2、通过键盘输入的形式  输入我想要查询对象的名字、
            seOne_name = input("请输入你想要查询的名字：")
            # 3、遍历列表，如果列表内部有对象的name属性和我想要查询的名字保持一致
            #    我们就输出这个对象，否则我们就输出没有找到该对象
            for i in self.stu_list:
                if i.name == seOne_name:
                    print(i)
                else:
                    print("没有找到数据！！！！！")
    def seAll_stu(self):
        # 直接遍历列表内部数据并且输出
        for i in self.stu_list:
            print(i)

    # 保存列表内部的数据到文件
    def save(self):
        # 1、创建文件
        """
        open()  这是打开文件的方式
        student.data：这是文件的路径。因为我们这里是同模块调用，所以直接写，如果是其他模块调用就需要写路径
        “w” :文件大开方式  w 表示写文件，如果我们有指定文件，那就清空文件再写入数据，如果没有指定文件就创建
             然后再写入数据。
        """
        f = open("student.data","w",encoding="UTF-8")
        # 2、把我们列表内部的数据转换成为字典
        """
        for i in self.stu_list:遍历列表内部数据，每一个i都是一个对象
        i.__dict__:把对象i转换成为字典形式  字典形式就是key-value
        例如：i内部name属性值为张三   转换为字典形式就是  "name":"张三"
        这样的形式有利于我们后期从文件内部取出数据
        """
        new_list = [i.__dict__ for i in self.stu_list]
        # 3、文件内部只能写入字符串，所以要把字典内部的数据转换成为字符串  str()
        a = str(new_list)
        # 4、把字符串写入文件
        f.write(a)
        # 5、关闭文件
        f.close()

    # 加载数据
    def load(self):
        # 1、也要先获取文件
        try:
            # r 表示读取文件数据
            f = open("student.data","r",encoding="UTF-8")
        except: # 如果try里面出现异常就只想except里面的代码
            f = open("student.data", "w", encoding="UTF-8")
        else: # 如果try里面没有出现异常就执行else里面的代码
            # 获取数据
            data = f.read()
            # 把文件里面的字符串数据转换成为字典数据
            new_list = eval(data)
            # 把字典数据取出并保存到列表里面   i['key值'] 得到对应的value值
            self.stu_list = [Student(i['name'],i['age'],
                                     i['gender'],i['tel'])
                             for i in new_list]


